//
//  ViewController.swift
//  swift-02-demo
//
//  Created by China Dragon on 2023/8/21.
//

import UIKit
/*
demo演练步骤
 1、设置 UITableViewController
 2、加载数据，利用闭包模拟网络异步加载数据
 3、自定义 Cell , 绑定 cell，通过模型设置cell的内容 (PersonCell)
 4、跳转界面 -> DetailViewController -> 界面的布局
 5、传递数据
 6、保存数据、刷新表格、利用闭包来实现
 */

class ViewController: UITableViewController {
    private var persons: [Person]?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        loadData { responseData in
//            print(responseData)
            //记录接受的参数
            self.persons = responseData// 闭包里使用self
            //刷新表格
            self.tableView.reloadData()
        }
    }
    
    /*
     swift - 我的 prepareForSegue() 方法不起作用
     https://www.coder.work/article/2358929
     
     swift 3:

     override func prepare(for segue: UIStoryboardSegue, sender: Any?)

     swift 2:

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)


     prepare 从一个页面 跳转到另一个页面调用的方法
     
     */
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        //1、拿到目标控制器
        guard let detailVC = segue.destination as? DetailViewController else{
            return
        }
        
        //2、获取用户当前选中的行数
        guard let indexPath = tableView.indexPathForSelectedRow else{
            return
        }
        
        let person = persons![indexPath.row]
        
        detailVC.person = person
        
        //完成回调
//        detailVC.didSaveCallBack = {
//            //刷新表格
//            self.tableView.reloadData()
//        }
        
        //完成回调 简写传递了一份可以执行的 函数
        detailVC.didSaveCallBack = self.tableView.reloadData
        
        
    }
}

/*
 Swift中的扩展（Extension）
 https://blog.csdn.net/zjh467545737/article/details/120153677
 https://blog.csdn.net/run_in_road/article/details/126653401
 */


//MARK: - 数据源方法
extension ViewController{
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //如果persons 为 nil , 直接返回 0
        return persons?.count ?? 0
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // 这个 Cell 是在 Main.storyboard 里tableview的Cell属性里自定义的 identifier：Cell
//        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PersonCell
        //这里persons后面可以直接使用! ，因为 只有有数据才会调用这个数据源方法
        //persons 一定是有数据的
//        cell.textLabel?.text = persons![indexPath.row].name
        cell.person = persons![indexPath.row]
        return cell
    }
    
   
    
}
//extension 类似于 oc 中的分类，可以将控制器的代码分组，便于维护和管理
//MARK: - 数据处理
extension ViewController{
    
    // 加载数据 -> 字典数组 -> 模型数组
    private func loadData(completion:@escaping(_ responseData: [Person]) ->()){
        
        DispatchQueue.global().async {
            print("耗时操作")
            
            //拼接个人信息数组
            var dataList = [Person]()
            for i in 0 ..< 50{
                let name = "test \(i)"
                /*
                 Swift - 随机数生成
                 https://blog.csdn.net/LiqunZhang/article/details/115520760
                 
                 https://blog.csdn.net/henry_lei/article/details/111313489
                 */
                //生成一个0～19的随机数
//                let age = random() % 20 + 10
                let age = arc4random () % 20 + 10
                let dict = ["name":name, "age":age]
                
                //字典转模型，追加到数组
                dataList.append(Person(dict: dict))
            }
            
            //测试数据
//            print(dataList)
            
            DispatchQueue.main.async {
                print("完成回调")
                completion(dataList )
            }
        }
    }
}// 快捷键：option + com + 左(<)折叠代码


